package com.softer.wxzj.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.softer.wxzj.common.entity.CommonResult;
import com.softer.wxzj.common.entity.Page;
import com.softer.wxzj.common.enums.NumberEnum;
import com.softer.wxzj.common.enums.ShiroResultEnum;
import com.softer.wxzj.common.util.DateUtils;
import com.softer.wxzj.common.util.ShiroUserUtil;
import com.softer.wxzj.common.util.StringUtils;
import com.softer.wxzj.common.util.UUIDUtil;
import com.softer.wxzj.entity.DicRate;
import com.softer.wxzj.entity.RateConfig;
import com.softer.wxzj.mapper.RateConfigMapper;
import com.softer.wxzj.service.RateConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author Gong Zhiyang
 * @date 2019/7/5
 */
@Service
public class RateConfigServiceImpl implements RateConfigService {
    @Autowired
    private RateConfigMapper rateConfigMapper;

    /**
     * 新增利率配置
     *
     * @param rateConfig 利率配置
     * @return 新增结果
     */
    @Override
    public CommonResult add(RateConfig rateConfig) {
        CommonResult commonResult = checkDate(rateConfig);
        if (ShiroResultEnum.FAIL.getCode() == commonResult.getData()) {
            return commonResult;
        }
        String userName = ShiroUserUtil.getUserName();
        rateConfig.setCreater(userName);
        rateConfig.setModifier(userName);
        rateConfig.setId(UUIDUtil.getUUID());
        int num = rateConfigMapper.insert(rateConfig);
        return CommonResult.ResponseResult(num);
    }

    /**
     * 校验添加的时间
     * 如果该利率类型 在数据库中存在数据，则新增的开始时间必须紧接着上一次的结束时间，否则返回失败
     *
     * @param rateConfig 利率实体
     * @return 结果
     */
    private CommonResult checkDate(RateConfig rateConfig) {
        String beginTime = rateConfig.getBeginTime();
        if (StringUtils.isBlank(beginTime)) {
            return CommonResult.ResponseResult(NumberEnum.ZERO.getNum(), "请选择开始日期");
        }
        if (StringUtils.isBlank(rateConfig.getEndTime())) {
            rateConfig.setEndTime(null);
        }
        // 如果该利率类型 在数据库中存在数据，则新增的开始时间必须紧接着上一次的结束时间，否则返回失败
        //根据利率类型，查询最近一次的新增数据
        RateConfig lastData = rateConfigMapper.getDataByTypeId(rateConfig.getRateTypeId());
        if (lastData != null) {
            String endTime = lastData.getEndTime();
            if (StringUtils.isBlank(endTime)) {
                //结束时间为null，直接返回失败
                return CommonResult.ResponseResult(NumberEnum.ZERO.getNum(), "该类型上次添加没有结束时间，禁止添加新数据");
            }
            //如果不为空，判断当前添加时间是否为上次结束时间的下一天
            String day = DateUtils.getDay(endTime);
            if (!beginTime.equals(day)) {
                return CommonResult.ResponseResult(NumberEnum.ZERO.getNum(), "开始时间选择有误，开始时间应为:" + day);
            }
        }
        return CommonResult.ResponseResult(NumberEnum.ONE.getNum());
    }

    /**
     * 获取利率类型列表
     *
     * @return 利率类型列表
     */
    @Override
    public List<DicRate> getDicRateList() {
        return rateConfigMapper.getDicRateList();
    }

    /**
     * 查询利率详情
     *
     * @param id ID
     * @return 详情
     */
    @Override
    public RateConfig getInfo(String id) {
        RateConfig rateConfig = rateConfigMapper.selectByPrimaryKey(id);
        return rateConfig;
    }

    /**
     * 查询利率配置列表
     *
     * @param page       分页实体
     * @param rateConfig 查询实体
     * @param fuzzy      模糊查询字段
     * @return 列表
     */
    @Override
    public PageInfo<RateConfig> getList(Page page, RateConfig rateConfig, String fuzzy) {
        List<RateConfig> list;
        PageHelper.startPage(page.getPageNum(), page.getPageSize());
        if (StringUtils.isBlank(fuzzy)) {
            //精确查询
            list = rateConfigMapper.getList(rateConfig);
        } else {
            //模糊查询
            list = rateConfigMapper.fuzzySearch(fuzzy);
        }
        PageInfo<RateConfig> pageInfo = new PageInfo<>(list);
        return pageInfo;
    }
    /**
     * 修改利率配置
     *
     * @param rateConfig 利率实体
     * @return 修改结果
     */
    @Override
    public CommonResult update(RateConfig rateConfig) {
        //TODO 修改逻辑未定
        return null;
    }
    /**
     * 删除利率配置
     *
     * @param id 利率配置ID
     * @return 结果
     */
    @Override
    public CommonResult delete(String id) {
        //TODO 删除逻辑未定
        return null;
    }
}
